package com.cn.zpark;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.util.List;

/**
 * @PackageName: com.cn.zpark
 * @ClassName: Dom4jAnalysis
 * @Description:
 * @author: RZS
 * @date: 2022/4/1  9:31
 */
public class Dom4jAnalysis {
    /*
     * 使用dom4j解析xml的大致步骤
     * 1.创建SAXReader
     * 2.使用SAXReader读取xml文档并且生成Document对象。
     * 	  这一步也是dom解析耗资源的地方，因为首先要先将文档所有数据读取完毕，并且以一个Document对象
     * 	  的形式保存在内存当中
     * 3.通过Document对象获取根元素
     * 4.按照xml文档的结构从根元素开始逐级遍历xml文档数据的目的
     */
    public static void main(String[] args) {
        // 1.创建SAXReader
        SAXReader reader = new SAXReader();
        // 获取xml文件路径
        String path = Dom4jAnalysis.class.getClassLoader().getResource("./web.xml").getPath();
        System.out.println(path);
        try {
            // 2.使用SAXReader读取xml文档并且生成Document对像
            Document doc = reader.read(path);
            /*
             * Document提供了获取根元素的方法：Element getRootElement()
             *
             * 而element的每一个实例用于表示当前xml文件的一个元素（一对标签），它提供了获取
             * 其元素相关的方法：
             * 获取当前标签的名字：String getName()
             * 获取当前标签中间的文本：String getText()
             * 获取当前标签下指定名字的子标签：Element element(String name)
             * 获取当前标签下的所有子标签：List elements()
             * 获取当前标签下指定名字的子标签：List elements(String name)
             *
             * 获取当前标签下指定名字标签的属性：Attribute attribute(String name)
             * Attribute的每一个实例表示一个属性，它有两个方法：
             * 获取属性名：String getName()
             * 获取属性值：String getValue()
             */
            // 3.通过Document对象获取根元素
            Element rootElement = doc.getRootElement();
            // 获取根标签下的所有子标签
            List<Element> lists = rootElement.elements();
            // 循环遍历取出根标签的所有子标签 
            for (Element list : lists) {
                // 获取跟标签下子标签的名字
                System.out.println(list.getName());
                // 获取标签的属性
                Attribute attribute = list.attribute("id");
                if(attribute != null){
                    System.out.println(attribute.getValue());
                }
                // 获取子标签下的所有子标签
                List<Element> elements = list.elements();
                // 循环取出子标签里面的所有子标签
                for (Element element : elements) {
                    // 获取标签名字
                    String elName = element.getName();
                    // 获取标签的文本内容
                    String value = element.getTextTrim();

                    System.out.println(elName + " : " + value);
                }
                System.out.println("-------------------------------------");
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
}
